package com.lxz.rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @date: 2021-06-03 14:57
 * @author: liangxz
 */
//简单模式
public class Producer{

    public static void main(String[] args){

        //所有的中间件技术都是基于tcp/ip协议基础之上构建新型的的协议规范，只不过rabbitmq遵循的是AMQP协议

        //1.创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("127.0.0.1");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        connectionFactory.setVirtualHost("/");  //设置虚拟节点，也就是放在rabbitmq的根目录下

        Connection connection = null;
        Channel channel=null;
        try {
            //2、创建连接connection
            connection = connectionFactory.newConnection("生产者");
            //3、通过连接获取通道channel
            channel = connection.createChannel();
            //4、通过创建交换机，声明队列，绑定关系，路由key，发送消息和接受消息

    /*
       参数1：队列名称
       参数2: durable=false 是否持久化，非持久化消息会存盘吗？会存盘，但是会随着重启服务器而丢失  如果为false非持久化
       参数3:排他性，是否独占队列
       参数4:是否自动删除，随着最后一个消费者消息完毕消息以后是否把队列自动删除
  	   参数5:携带附属属性
    */
            String queueName = "queue1";
            channel.queueDeclare(queueName,false,false,false,null);
            //5、准备消息内容
            String message = "Hello 世界";
            //6、发送消息给队列queue
    /*参数1: 交换机
      参数2:队列、路由key
      参数3:消息的状态控制
  	  参数4:消息主题
    */
            //面试题：可以存在没有交换机的队列吗？不可能，虽然没有指定交换机但是一定会存在一个默认的交换机

            channel.basicPublish("",queueName, null,message.getBytes());
            System.out.println("消息发送成功");

        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            //7、关闭通道
            if (channel!=null && channel.isOpen()){
                try {
                    channel.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            //8、关闭连接
            if (connection!=null && connection.isOpen()){
                try {
                    connection.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }

    }

}